Overview and implementation of noise functions, focusing on their power spectrum.
%matplotlib inline
import matplotlib.pyplot as plt
from IPython.display import Audio
import numpy as np
from _utils import *
fs = 44100 # Sampling rate
dur = 10 # Duration in seconds
t = np.linspace(0, dur, fs*dur) # Time vector
The power spectral density is equivalent to $\large \frac{1}{f^0}$, which is constant.
A = 0.5
X_white = np.random.uniform(-1, 1, fs*dur//2 + 1)
x_white = np.fft.irfft(X_white).real
x_white = A*x_white/np.abs(x_white).max()
x_white[-1] = 1 # fix normalized output
Audio(x_white, rate=fs)
summary(x_white[:-1])
min: -0.5000
1st Quar: -0.0678
median: 0.0002
mean: 0.0002
3rd Quar: 0.0680
max: 0.4401
sigma: 0.1006
audiovis(x_white[:-1], tlim=[0, 0.1])
audio mono
spectrogram(x_white, flim=[0, 20000])
audio mono
fig = plt.figure(figsize=(16, 8))
plt.psd(x_white, 2048, fs, color='#888888')
plt.xscale('log')
plt.xlim([1e2, 1e4])
plt.ylim([-80,-50])
plt.show()
The power spectral density is equivalent to $\large \frac{1}{f}$, which decreases 3 dB per octave.
A = 0.5
X_pink = np.random.uniform(-1, 1, fs*dur//2 + 1)
H = (np.arange(X_pink.size) + 1)**0.5
x_pink = np.fft.irfft(X_pink/H).real
x_pink = A*x_pink/np.abs(x_pink).max()
x_pink[-1] = 1 # fix normalized output
Audio(x_pink, rate=fs)
summary(x_pink[:-1])
min: -0.4908
1st Quar: -0.1192
median: -0.0405
mean: -0.0403
3rd Quar: 0.0383
max: 0.5000
sigma: 0.1158
audiovis(x_pink[:-1], tlim=[0, 0.1])
audio mono
spectrogram(x_pink, flim=[0, 20000])
audio mono
fig = plt.figure(figsize=(16, 8))
plt.psd(x_pink, 2048, fs, color='#FF88CC')
plt.xscale('log')
plt.xlim([1e2, 1e4])
plt.ylim([-80,-50])
plt.show()
The power spectral density is equivalent to $\large \frac{1}{f^2}$, which decreases 6 dB per octave.
A = 0.5
X_brown = np.random.uniform(-1, 1, fs*dur//2 + 1)
H = np.arange(X_brown.size) + 100
x_brown = np.fft.irfft(X_brown/H).real
x_brown = A*x_brown/np.abs(x_brown).max()
x_brown[-1] = 1 # fix normalized output
Audio(x_brown, rate=fs)
summary(x_brown[:-1])
min: -0.4958
1st Quar: -0.1239
median: -0.0222
mean: -0.0170
3rd Quar: 0.0868
max: 0.5000
sigma: 0.1477
audiovis(x_brown[:-1], tlim=[0, 0.1])
audio mono
spectrogram(x_brown, flim=[0, 20000])
audio mono
fig = plt.figure(figsize=(16, 8))
plt.psd(x_brown, 2048, fs, color='#AA4444')
plt.xscale('log')
plt.xlim([1e2, 1e4])
plt.ylim([-80,-50])
plt.show()
The power spectral density is equivalent to $\large f$, which increases 3 dB per octave.
A = 0.5
X_blue = np.random.uniform(-1, 1, fs*dur//2 + 1)
H = np.arange(X_blue.size)**0.5
x_blue = np.fft.irfft(X_blue*H).real
x_blue = A*x_blue/np.abs(x_blue).max()
x_blue[-1] = 1 # fix normalized output
Audio(x_blue, rate=fs)
summary(x_blue[:-1])
min: -0.4685
1st Quar: -0.0715
median: 0.0000
mean: 0.0000
3rd Quar: 0.0718
max: 0.5000
sigma: 0.1059
audiovis(x_blue[:-1], tlim=[0, 0.1])
audio mono
spectrogram(x_blue, flim=[0, 20000])
audio mono
fig = plt.figure(figsize=(16, 8))
plt.psd(x_blue, 2048, fs, color='#0088FF')
plt.xscale('log')
plt.xlim([1e2, 1e4])
plt.ylim([-90,-50])
plt.show()
The power spectral density is equivalent to $\large f^2$, which increases 6 dB per octave.
A = 0.5
X_violet = np.random.uniform(-1, 1, fs*dur//2 + 1)
H = np.arange(X_violet.size)
x_violet = np.fft.irfft(X_violet*H).real
x_violet = A*x_violet/np.abs(x_violet).max()
x_violet[-1] = 1 # fix normalized output
Audio(x_violet, rate=fs)
summary(x_violet[:-1])
min: -0.5000
1st Quar: -0.0688
median: -0.0002
mean: -0.0000
3rd Quar: 0.0688
max: 0.4422
sigma: 0.1018
audiovis(x_violet[:-1], tlim=[0, 0.1])
audio mono
spectrogram(x_violet, flim=[0, 20000])
audio mono
fig = plt.figure(figsize=(16, 8))
plt.psd(x_violet, 2048, fs, color='#AA00FF')
plt.xscale('log')
plt.xlim([1e2, 1e4])
plt.ylim([-90,-50])
plt.show()
fig = plt.figure(figsize=(16, 8))
plt.psd(x_violet, 2048, fs, color='#AA00FF')
plt.psd(x_blue, 2048, fs, color='#0088FF')
plt.psd(x_white, 2048, fs, color='#888888')
plt.psd(x_pink, 2048, fs, color='#FF88CC')
plt.psd(x_brown, 2048, fs, color='#AA4444')
plt.xscale('log')
plt.xlim([1e2, 1e4])
plt.ylim([-90,-50])
plt.show()